/**
 * Project Name: antiques File Name: ImageProcess.java Package Name: com.sinosoft.antiques.util
 * Date: 2016年11月15日上午9:47:50 Copyright (c) 2016, ISCAS Rights Reserved.
 */

package com.sinosoft.antiques.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

//import javax.imageio.ImageIO;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.sinosoft.antiques.exception.InvalidStringException;
import com.sinosoft.commontools.str.StrHelp;

/**
 * ClassName: ImageProcess <br/>
 * Date: 2016年11月15日 上午9:47:50 <br/>
 * 
 * @author paddy
 * @version 1.0
 * @since JDK 1.7
 * @see
 */
public class ImageProcess {

	public static final Logger logger = LogManager
			.getLogger(ImageProcess.class);

	/**
	 * @Description: 原文件名加上一个后缀生成新文件名 如: src- xxx.jpg appendage - 123 新文件名则为
	 *               xxx123.jpg
	 * 
	 * @author paddy
	 * @since JDK 1.7
	 * @Date 2016年11月15日 下午12:49:27
	 * @param srcName
	 * @param appendage
	 * @return
	 * @throws InvalidStringException
	 */
	public static String newFileName(String srcName, String appendage)
			throws InvalidStringException {
		if (!StrHelp.isValidStr(srcName))
			throw new InvalidStringException();

		int index = srcName.lastIndexOf(".");
		String fileType = srcName.substring(index);

		String fileNameWithoutType = srcName.substring(0, index);

		return fileNameWithoutType + appendage + fileType;
	}

	/**
	 * @Description: 图片等比例缩放 输出路径与源文件在同一路径下 比如源文件为: a/b/c.jpg 目标文件为:
	 *               a/b/c_max.jpg max替换成具体变量值
	 * @author paddy
	 * @since JDK 1.7
	 * @Date 2016年11月15日 上午10:56:27
	 * @param src
	 * @param max
	 * @throws InvalidStringException
	 * @throws FileNotFoundException
	 */
	public static String zoom(String src, int max)
			throws InvalidStringException, FileNotFoundException, IOException {
		return zoom(src, new File(src).getPath(), max);
	}

	/**
	 * @Description:
	 * 
	 * @author paddy
	 * @since JDK 1.7
	 * @Date 2016年11月15日 上午10:41:34
	 * @param src
	 *            源文件全路径，精确到文件名
	 * @param dst
	 *            目标文件路径，只提供文件夹即可，也可以具体到文件。可选。 如果只指定目录，则目标文件名以源文件名加max组成
	 *            如果具体到文件，则文件类型以dst文件扩展名为准
	 * @param max
	 *            缩放后图片的最长边的长度
	 * @return 新生成图像的全路径
	 * @throws InvalidStringException
	 * @throws FileNotFoundException
	 */
	public static String zoom(String src, String dst, int max)
			throws InvalidStringException, FileNotFoundException, IOException {

		if (!StrHelp.isValidStr(src))
			throw new InvalidStringException();

		File srcFile = new File(src);
		if (!srcFile.exists())
			throw new FileNotFoundException();

		if (!StrHelp.isValidStr(dst))
			throw new InvalidStringException();

		String fileType = null;
		String fileName = null;
		File pFile = null;

		File dstFile = new File(dst);

		if (dstFile.getPath() != null) {
			pFile = dstFile.getParentFile();
			if (!pFile.exists())
				pFile.mkdirs();
			if (dstFile.getName().indexOf(".") != -1)
				fileName = dstFile.getName();
			else
				fileName = srcFile.getName();
		} else {
			pFile = srcFile.getParentFile();
			fileName = dstFile.getName();
		}
		StringBuilder outFileName = new StringBuilder(pFile.getAbsolutePath());
		if (!dst.endsWith(File.separator))
			outFileName.append(File.separator);
		try {
			outFileName.append(newFileName(fileName, "_" + max));
			// outFileName.append(newFileName(fileName,""));
		} catch (InvalidStringException e) {
			logger.error(e);
			return "";
		}
		dst = outFileName.toString();
		// InputStream iStream = new FileInputStream(srcFile);
		// FileUtils.copyInputStreamToFile(iStream, new File(dst));
		int index = fileName.lastIndexOf(".");
		fileType = fileName.substring(index + 1);

		// boolean res = thumbnail(dst, max);
		// if(!res)
		// return "";
		BufferedImage im = null;
		try {
			im = ImageIO.read(srcFile);
		} catch (IOException e) {
			logger.error(e);
			return "";
		}

		if (im == null)
			return "";
		/* 原始图像的宽度和高度 */
		int width = im.getWidth();
		int height = im.getHeight();

		/* 调整后的图片的宽度和高度 */
		int toWidth = 0;
		int toHeight = 0;

		// 调整比率
		float ratio = 0.0f;

		// 以图片最长边作为调整标准
		if (width > height) {
			if (width < max) {// 如果长边小于缩率边则返回空字符串
				return "";
			}
			ratio = width / max;
			toWidth = max;
			toHeight = (int) (height / ratio);
		} else {
			if (height < max) {// 如果长边小于缩率边则返回空字符串
				return "";
			}
			ratio = height / max;
			toWidth = (int) (width / ratio);
			toHeight = max;
		}

		/* 新生成结果图片 */
		BufferedImage dstBufferedImage = new BufferedImage(toWidth, toHeight,
				BufferedImage.TYPE_INT_RGB);

		dstBufferedImage.getGraphics().drawImage(
				im.getScaledInstance(toWidth, toHeight,
						java.awt.Image.SCALE_SMOOTH), 0, 0, null);

		// 输出图片
		FileOutputStream imgOutStream;
		try {
			imgOutStream = new FileOutputStream(dst);
			ImageIO.write(dstBufferedImage, fileType, imgOutStream);
			imgOutStream.close();
		} catch (FileNotFoundException e) {
			logger.error(e);
		} catch (IOException e) {
			logger.error(e);
		}

		return dst;
	}

	/*
	 * private static boolean thumbnail(String filePathAndName, int width) {
	 * boolean res = false; try {
	 * Thumbnails.of(filePathAndName).scale(0.5).toFile(filePathAndName); res =
	 * true; } catch (IOException e) { logger.error("-----读取图片发生异常:{}-----",
	 * e.getMessage()); logger.info("-----尝试cmyk转化-----"); File cmykJPEGFile =
	 * new File(filePathAndName); try { BufferedImage image =
	 * ImageIO.read(cmykJPEGFile); ImageOutputStream output =
	 * ImageIO.createImageOutputStream(cmykJPEGFile); if (!ImageIO.write(image,
	 * "jpg", output)) { logger.info("-----cmyk转化异常:{}-----"); }
	 * Thumbnails.of(image).scale(0.5).toFile(filePathAndName);
	 * logger.info("-----cmyk转化成功-----"); res = true; } catch (IOException e1) {
	 * logger.info("-----cmyk转化异常:{}-----", e1.getMessage()); } } return res; }
	 */
	public static void main(String[] args) throws InvalidStringException,
			FileNotFoundException, IOException {
		// 用例1
		String src = "C:\\Users\\paddy\\Desktop\\test.jpg";
		zoom(src, "test.png", 250);

		// 用例2
		src = "C:\\Users\\paddy\\Desktop\\test.jpg";
		zoom(src, "C:\\Users\\paddy\\Desktop", 250);

		// 用例3
		src = "C:\\Users\\paddy\\Desktop\\test.jpg";
		zoom(src, "C:\\Users\\paddy\\Desktop\\test1.jpg", 250);
	}

}
